数组参数

  如果将数组作为函数的参数,传递的就是到数组的首元素的指针。例如,

    int strlen(const char*);
    void f()
    {
        char v[] = "an array";
        int i = strlen(v);
        int j = strlen("Nicholas");
    }

也就是说,类型T[]作为参数传递时将被转换为一个T*。这也就意味着,对数组参数的某个元素的赋值,将改变实际参数数组中那个元素的值。换句话说,数组与其他类型不同,数组不会(也不能)按值的方式传递。

  对于被调用函数而言,数组参数的大小是不可用的。这可能成为一个麻烦,但存在许多可以绕过这个问题的方式。C风格的字符串是以0结束的,它们的大小就很容易计算。对于别的数组,可以传递第二个参数,用它刻画数组的大小,例如,

    void compute1(int* vec_ptr, int vec_size);        // 一种方法
    struct Vec {
        int* ptr;
        int size;
    };
    void compute2(const Vec& v);                      // 另一种方法

换一种方式,我们也可以不用数组,而用vector(3.7.1节、16.3节)等类型。

  多维数组的情况更加诡异(C.7节),但通常可以改用指针的数组,这样做并不需要特别的处理。例如,

    char* day[] = {
        "mon", "tue", "wed", "thu", "fri", "sat", "sun"
    };

再提一次,vector等类型可以用于代替内部的、低级的数组和指针等一类东西。

🔚